package com.github.vole.common.utils.httpclient;

/**
 * HTTP STATUS代码
 */
public enum HTTPCode {
	// 1xx 禁用
	// 这一类型的状态码，代表请求已被接受，需要继续处理。这类响应是临时响应，只包含状态行和某些可选的响应头信息，并以空行结束
	// 由于HTTP/1.0 协议中没有定义任何 1xx 状态码，所以除非在某些试验条件下，服务器禁止向此类客户端发送 1xx 响应
	/** Continue : 客户端应当继续发送请求 */
	_100("100"),
	/**
	 * Switching Protocols : 服务器已经理解了客户端的请求，并将通过 Upgrade消息头通知客户端采用不同的协议来完成这个请求
	 */
	_101("101"),
	/** Processing : 处理将被继续执行 */
	_102("102"),
	// 2xx 成功
	// 这一类型的状态码，代表请求已成功被服务器接收、理解、并接受
	/** OK : 请求已成功 */
	_200("200"),
	/** Created : 请求已经被实现，而且有一个新的资源已经依据请求的需要而建立，且其 URI 已经随 Location 头信息返回 */
	_201("201"),
	/** Accepted : 服务器已接受请求，但尚未处理 */
	_202("202"),
	/**
	 * Non-Authoritative Information :
	 * 服务器已成功处理了请求，但返回的实体头部元信息不是在原始服务器上有效的确定集合，而是来自本地或者第三方的拷贝
	 */
	_203("203"),
	/** No Content : 服务器成功处理了请求，但不需要返回任何实体内容，并且希望返回更新了的元信息 */
	_204("204"),
	/** Reset Content : 服务器成功处理了请求，且没有返回任何内容 */
	_205("205"),
	/** Partial Content : 服务器已经成功处理了部分 GET 请求 */
	_206("206"),
	/**
	 * Multi-Status : 由WebDAV(RFC
	 * 2518")扩展的状态码，代表之后的消息体将是一个XML消息，并且可能依照之前子请求数量的不同，包含一系列独立的响应代码
	 */
	_207("207"),
	// 3xx 重定向
	// 类状态码代表需要客户端采取进一步的操作才能完成请求
	/** Multiple Choices : 被请求的资源有一系列可供选择的回馈信息，每个都有自己特定的地址和浏览器驱动的商议信息 */
	_300("300"),
	/**
	 * Moved Permanently : 被请求的资源已永久移动到新位置，并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一
	 */
	_301("301"),
	/** Found : 请求的资源现在临时从不同的 URI 响应请求 */
	_302("302"),
	/** See Other : 对应当前请求的响应可以在另一个 URI 上被找到，而且客户端应当采用 GET 的方式访问那个资源 */
	_303("303"),
	/**
	 * Not Modified : 如果客户端发送了一个带条件的 GET
	 * 请求且该请求已被允许，而文档的内容（自上次访问以来或者根据请求的条件）并没有改变，则服务器应当返回这个状态码
	 */
	_304("304"),
	/** Use Proxy : 被请求的资源必须通过指定的代理才能被访问 */
	_305("305"),
	/** Switch Proxy : 在最新版的规范中，306状态码已经不再被使用 */
	_306("306"),
	/** Temporary Redirect : 请求的资源现在临时从不同的 URI 响应请求 */
	_307("307"),
	// 400 Bad Request
	// 由于包含语法错误，当前请求无法被服务器理解。除非进行修改，否则客户端不应该重复提交这个请求
	/** Bad Request : 由于包含语法错误，当前请求无法被服务器理解 */
	_400("400"),
	/** Unauthorized : 当前请求需要用户验证 */
	_401("401"),
	/** Payment Required : 该状态码是为了将来可能的需求而预留的 */
	_402("402"),
	/** Forbidden : 服务器已经理解请求，但是拒绝执行它 */
	_403("403"),
	/** Not Found : 请求失败，请求所希望得到的资源未被在服务器上发现 */
	_404("404"),
	/** Method Not Allowed : 求行中指定的请求方法不能被用于请求相应的资源 */
	_405("405"),
	/** Not Acceptable : 求的资源的内容特性无法满足请求头中的条件，因而无法生成响应实体 */
	_406("406"),
	/** Proxy Authentication Required : 与401响应类似，只不过客户端必须在代理服务器上进行身份验证 */
	_407("407"),
	/** Request Timeout : 请求超时 */
	_408("408"),
	/** Conflict : 由于和被请求的资源的当前状态之间存在冲突，请求无法完成 */
	_409("409"),
	/** Gone : 被请求的资源在服务器上已经不再可用，而且没有任何已知的转发地址 */
	_410("410"),
	/** Length Required : 服务器拒绝在没有定义 Content-Length 头的情况下接受请求 */
	_411("411"),
	/** Precondition Failed : 服务器在验证在请求的头字段中给出先决条件时，没能满足其中的一个或多个 */
	_412("412"),
	/**
	 * Request Entity Too Large : 服务器拒绝处理当前请求，因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围
	 */
	_413("413"),
	/** Request-URI Too Long : 请求的 URI 长度超过了服务器能够解释的长度，因此服务器拒绝对该请求提供服务 */
	_414("414"),
	/**
	 * Unsupported Media Type : 对于当前请求的方法和所请求的资源，请求中提交的实体并不是服务器中所支持的格式，因此请求被拒绝
	 */
	_415("415"),
	/**
	 * Requested Range Not Satisfiable : 如果请求中包含了 Range 请求头，并且 Range
	 * 中指定的任何数据范围都与当前资源的可用范围不重合，同时请求中又没有定义 If-Range 请求头，那么服务器就应当返回416状态码
	 */
	_416("416"),
	/**
	 * Expectation Failed : 请求头 Expect
	 * 中指定的预期内容无法被服务器满足，或者这个服务器是一个代理服务器，它有明显的证据证明在当前路由的下一个节点上，Expect 的内容无法被满足
	 */
	_417("417"),
	/**
	 * There are too many connections from your internet address :
	 * 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围
	 */
	_421("421"),
	/** Unprocessable Entity : 请求格式正确，但是由于含有语义错误，无法响应 */
	_422("422"),
	/** Locked : 当前资源被锁定 */
	_423("423"),
	/** Failed Dependency : 于之前的某个请求发生的错误，导致当前请求失败，例如 PROPPATCH */
	_424("424"),
	/** Unordered Collection : */
	_425("425"),
	/** Upgrade Required : 客户端应当切换到TLS/1.0 */
	_426("426"),
	/** Retry With : 由微软扩展，代表请求应当在执行完适当的操作后进行重试 */
	_449("449"),
	// 5xx 服务器错误
	// 这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生，也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理
	// 这些状态码适用于任何响应方法
	/** Internal Server Error : 服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理 */
	_500("500"),
	/** Not Implemented : 服务器不支持当前请求所需要的某个功能 */
	_501("501"),
	/** Bad Gateway : 作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应 */
	_502("502"),
	/** Service Unavailable : 由于临时的服务器维护或者过载，服务器当前无法处理请求 */
	_503("503"),
	/**
	 * Gateway Timeout :
	 * 作为网关或者代理工作的服务器尝试执行请求时，未能及时从上游服务器（URI标识出的服务器，例如HTTP、FTP、LDAP）或者辅助服务器（例如DNS
	 * ）收到响应
	 */
	_504("504"),
	/** HTTP Version Not Supported : 服务器不支持，或者拒绝支持在请求中使用的 HTTP 版本 */
	_505("505"),
	/**
	 * Variant Also Negotiates :
	 * 代表服务器存在内部配置错误：被请求的协商变元资源被配置为在透明内容协商中使用自己，因此在一个协商处理中不是一个合适的重点
	 */
	_506("506"),
	/** Insufficient Storage : 服务器无法存储完成请求所必须的内容 */
	_507("507"),
	/** Bandwidth Limit Exceeded : 服务器达到带宽限制 */
	_509("509"),
	/** Not Extended : 获取资源所需要的策略并没有没满足 */
	_510("510");

	public final String VALUE;

	private HTTPCode(String VALUE) {
		this.VALUE = VALUE;
	}

	public HTTPCode valueof(String VALUE) {
		for (HTTPCode code : values()) {
			if (code.VALUE == VALUE) {
				return code;
			}
		}
		return null;
	}
}
